(deftemplate portatil 
	(slot Modelo (type STRING))
	(slot Pantalla (type FLOAT))
	(slot Procesador(type FLOAT))
	(slot Multicore (type INTEGER))
	(slot RAM (type INTEGER))
	(slot Tamaño_disco_duro (type INTEGER))
	(slot Velocidad_disco_duro (type INTEGER))
	(slot Grafica (type STRING)) ;integrada,profesional,media,alta
	(slot Blueray (type STRING))
	(slot DVD_Recorder (type STRING))
	(slot HDMI (type STRING))
	(slot N_USB (type INTEGER))
	(slot Autonomia (type INTEGER))
	(slot Peso 	(type FLOAT))
	(slot Precio(type INTEGER))
	(slot SO (type STRING))
	(slot Garantia (type INTEGER))
	(slot Color (type STRING))
        (slot Marca (type STRING))
)

;;Base de conocimiento inicial

(deffacts portatiles

(portatil 	(Modelo "Thinkpad T510") (Pantalla 15.6) (Procesador 2260) (Multicore 4) (RAM 2) (Tamaño_disco_duro 250) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" ) (DVD_Recorder "si") (HDMI "no") (N_USB 3) (Autonomia 8) (Peso 2.67) (Precio 1218) (Garantia 3) (Color "Negro") (SO Windows7_64bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad T510") (Pantalla 15.6) (Procesador 2660) (Multicore 4) (RAM 4) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Profesional")
			(Blueray "no" ) (DVD_Recorder "si") (HDMI "no") (N_USB 3) (Autonomia 8) (Peso 2.67) (Precio 1890) (Garantia 3) (Color "Negro") (SO Windows7_64bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad T410") (Pantalla 14.6) (Procesador 2260) (Multicore 4) (RAM 2) (Tamaño_disco_duro 250) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "si") (HDMI "no") (N_USB 3) (Autonomia 8) (Peso 2.67) (Precio 1263) (Garantia 3) (Color "Negro") (SO Windows7_64bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad T410") (Pantalla 15.6) (Procesador 2660) (Multicore 4) (RAM 4) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Profesional")
			(Blueray "no")(DVD_Recorder "si") (HDMI "no") (N_USB 3) (Autonomia 8) (Peso 2.67) (Precio 1890) (Garantia 3) (Color "Negro") (SO Windows7_64bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad Tablet X201") (Pantalla 12.1) (Procesador 2000) (Multicore 4) (RAM 4) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "no") (HDMI "no") (N_USB 2) (Autonomia 12) (Peso 1.36) (Precio 2179) (Garantia 3) (Color "Negro") (SO Windows7_64bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad X100e") (Pantalla 11.6) (Procesador 1600) (Multicore 1) (RAM 2) (Tamaño_disco_duro 160) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "si") (HDMI "no") (N_USB 2) (Autonomia 5) (Peso 1.36) (Precio 510) (Color "Negro") (SO Windows7_32bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad X100e") (Pantalla 11.6) (Procesador 1600) (Multicore 1) (RAM 2) (Tamaño_disco_duro 160) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "si") (HDMI "no") (N_USB 2) (Autonomia 5) (Peso 1.36) (Precio 510) (Color "Rojo vino") (SO Windows7_32bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad X100e") (Pantalla 11.6) (Procesador 1600) (Multicore 1) (RAM 2) (Tamaño_disco_duro 160) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "si") (HDMI "no") (N_USB 2) (Autonomia 5) (Peso 1.36) (Precio 510) (Garantia 1) (Color "Blanco perla") (SO Windows7_32bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad X100e") (Pantalla 11.6) (Procesador 1600) (Multicore 1) (RAM 2) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "si") (HDMI "no") (N_USB 2) (Autonomia 5) (Peso 1.36) (Precio 613) (Garantia 1) (Color "Negro") (SO Windows7_32bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad X100e") (Pantalla 11.6) (Procesador 1600) (Multicore 1) (RAM 2) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "si") (HDMI "no") (N_USB 2) (Autonomia 5) (Peso 1.36) (Precio 613) (Garantia 1) (Color "Rojo vino") (SO Windows7_32bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad X100e") (Pantalla 11.6) (Procesador 1600) (Multicore 1) (RAM 2) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "si") (HDMI "no") (N_USB 2) (Autonomia 5) (Peso 1.36) (Precio 613) (Garantia 1) (Color "Blanco perla") (SO Windows7_32bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad X100e") (Pantalla 12.1) (Procesador 1600) (Multicore 2) (RAM 2) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "no") (HDMI "no") (N_USB 2) (Autonomia 5) (Peso 1.36) (Precio 729) (Garantia 1) (Color "Negro") (SO Windows7_32bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad X100e") (Pantalla 12.1) (Procesador 16000) (Multicore 2) (RAM 2) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "no") (HDMI "no") (N_USB 2) (Autonomia 5) (Peso 1.36) (Precio 729) (Garantia 1) (Color "Rojo vino") (SO Windows7_32bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad X100e") (Pantalla 12.1) (Procesador 1600) (Multicore 2) (RAM 2) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Integrada")
			(Blueray "no" )(DVD_Recorder "no") (HDMI "no") (N_USB 2) (Autonomia 5) (Peso 1.36) (Precio 729) (Garantia 1) (Color "Blanco perla") (SO Windows7_32bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad W510") (Pantalla 15.6) (Procesador 3060) (Multicore 4) (RAM 4) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Profesional")
			(Blueray "si" )(DVD_Recorder "si") (HDMI "si") (N_USB 4) (Autonomia 18) (Peso 2.76) (Precio 2459) (Garantia 3) (Color "Negro") (SO Windows7_64bits) (Marca Lenovo))
(portatil 	(Modelo "Thinkpad W701") (Pantalla 17.0) (Procesador 1600) (Multicore 4) (RAM 4) (Tamaño_disco_duro 320) (Velocidad_disco_duro 1) (Grafica "Profesional")
			(Blueray "si" )(DVD_Recorder "si") (HDMI "si") (N_USB 4) (Autonomia 18) (Peso 2.76) (Precio 2679) (Garantia 3) (Color "Negro") (SO Windows7_64bits) (Marca Lenovo))

)

;-----------------------------------------------------------INICIO---------------------------------------------
;(deffacts programa(menu principal))

;-----------------------------------------------------------MENU PRINCIPAL---------------------------------------------
;(defrule menu_principal
;	(menu principal)
;	=>
;	( printout t "" crlf)
;	( printout t "" crlf)
;	( printout t "*****************************************************************" crlf )
;	( printout t "----- Ayudante de eleccion de portatiles Lenovo ------" crlf )
;	( printout t "1. Busqueda por Nombre -------> Si tienes claro cual es tu portatil escoge esta opcion" crlf )
;	( printout t "2. Busqueda por precio -------> Establece el rango de precio en el que quieres moverte" crlf)
;	( printout t "3. Busqueda por uso    -------> Elige en base al uso que quieres darle al portatil" crlf)
;	( printout t "*****************************************************************" crlf )
; 	( assert (busqueda (read) ))
;)
 
;----------------------------------------------------------NUMERO ERRONEO-----------------------------------------------
(defrule opcion_erronea
	?menu <- (menu principal)
	?eleccion <- (busqueda ?opcion)
	(test (or (not(integerp ?opcion))
	(< ?opcion 1)
	(> ?opcion 3) 
	 )) 
=>
  	;borramos las reglas anteriores
	(retract ?eleccion)
	(retract ?menu)
  	;se vuelve al menu
	(assert (menu principal))
	(printout t "La opcion escogida es" ?opcion ". No es valida, vuelva a probar." crlf )
)

;----------------------------------------------------------NUMERO VALIDO-----------------------------------------------
(defrule opcion_correcta
  	?menu <- (menu principal)
  	?eleccion <- (busqueda ?opcion)
  	(test (and(integerp ?opcion)
	(> ?opcion 0)
	(< ?opcion 4) 
	 ) ) 
=>
	;borramos las reglas anteriores
	(retract ?menu ?eleccion)
	;nos movemos a la busqueda
	(assert (menu busqueda ?opcion))
	(printout t "La opcion escogida es" ?opcion " ."crlf )
)

;----------------------------------------------------------BUSQUEDA POR NOMBRE-----------------------------------------------

(defrule menu_nombre
  ?eleccion <- (menu busqueda 1)
=>
 (retract ?eleccion)
 (assert (busqueda por nombre))
)
 
;----------------------------------------------------------LISTA DE PORTATILES-----------------------------------------------
(defrule opciones_busqueda_por_nombre
	(busqueda por nombre)
=>
	(printout t "As elegido busqueda por nombre, escoge el portatil que quieres" crlf
				"Escribe el modelo como se describe aqui y entre comillas. "crlf)
	(printout t "Thinkpad T510" crlf)
	(printout t "Thinkpad T410" crlf)
	(printout t "Thinkpad Tablet X201" crlf)
	(printout t "Thinkpad X100e" crlf)
	(printout t "Thinkpad W510" crlf)
	(printout t "Thinkpad W701" crlf)
	( assert (query (read) )) 
	
)
;-------------------------------------QUERY QUE DEVUELVE TODA LA INFORMACION DE LOS PORTATILES----------------------------
(defquery query_informacion_portatiles
	"Devuelve informacion de los portatiles con ese nombre"
	(declare (variables ?mod))
	(portatil 	(Modelo ?mod) (Pantalla ?pan) (Procesador ?pro) (Multicore ?mul) (RAM ?ram) (Tamaño_disco_duro ?Tdd) (Velocidad_disco_duro ?Vdd) (Grafica ?gra)
				(Blueray ?blue) (DVD_Recorder ?DVD) (HDMI  ?hdmi) (N_USB ?NUSB) (Autonomia ?auto) (Peso ?peso) (Precio ?precio) (Garantia ?gar) (Color ?col))
)
;-----------------------------------------COMPROBAMOS SI HAY RESULTADOS ----------------------------------------
(defrule cantidad_de_resultados
	(declare (salience -5))
	?eleccion <-(query ?nombre)
	?busqueda <- (busqueda por nombre)
=>
	(bind ?numeroDeResultados (count-query-results query_informacion_portatiles ?nombre))

	(if(> ?numeroDeResultados 0) then
		(assert (resultados ?numeroDeResultados))
		(retract ?busqueda)
		(printout t "//////// " ?numeroDeResultados " Resultados obtenidos /////////"crlf)		
	else 
		;si no tenemos resultados volvemos al menu anterior
		(retract ?eleccion)
		(retract ?busqueda)
		(assert(busqueda por nombre))
		(printout t "No se encontraron resultados" crlf)
	)
	
)


;-----------------------------------------LISTA DE LOS DATOS DEL PORTATIL ELEGIDO----------------------------------------
(defrule lista_de_caracteristicas
	(declare (salience -15))
	?eleccion <-(query ?nombre)
=>
	(bind ?result (run-query* query_informacion_portatiles ?nombre))
	(while (?result next)
    (printout t "------------------------------------------------------" crlf
				"Caracteristicas del: crlf"
				"Modelo: "(?result getString mod) crlf 
				"Pantalla: "(?result getString pan) crlf 
				"Procesador: "(?result getString pro) crlf 
				"Multicore: "(?result getString mul) crlf 
				"RAM: "(?result getString ram) crlf 
				"Tamaño de disco duro: "(?result getString Tdd) crlf
				"Velocidad de disco duro: "(?result getString Vdd) crlf 
				"Grafica: "(?result getString gra) crlf 
				"BlueRay: "(?result getString blue) crlf 
				"Grabador de DVD: "(?result getString DVD) crlf 
				"HDMI: "(?result getString hdmi) crlf 
				"Numero de USBs: "(?result getString NUSB) crlf 
				"Autonomia: "(?result getString auto) crlf 
				"Peso: "(?result getString peso) crlf 
				"Precio: "(?result getString precio) crlf 
				"Garantia: "(?result getString gar) crlf 
				"Color: "(?result getString col) crlf 
				))
)

;---------------------------------------------------------------------------------------------------------------------------- 
;----------------------------------------------------------BUSQUEDA POR USO -------------------------------------------------
;----------------------------------------------------------------------------------------------------------------------------
(defrule menu_uso
	?eleccion <- (menu busqueda 3)
	=>
	(retract ?eleccion)
	(assert (busqueda_por_uso))
)
;----------------------------------------------------------MENU USO-----------------------------------------------------------
(defrule busqueda_por_uso
	?estado <- (busqueda_por_uso)
=>
	(printout t "A elegido busqueda por uso" crlf
				"Escriba el numero que precede al uso que desea. "crlf)
	(printout t "1-Multimedia" crlf)
	(printout t "2-Ultraportatil" crlf)
	(printout t "3-Ultraportatil altas prestaciones" crlf)
	(printout t "4-Juegos" crlf)
	(printout t "5-Estacion de trabajo" crlf)
	(retract ?estado)
	(assert (uso_port (read)))
)
;---------------------------------------------------------REGLAS USO-----------------------------------------------------------
(defrule uso_multimedia
	?estado <- (uso_port 1)
	=>
	(retract ?estado)
	(assert (mostrar_multimedia))
)

(defrule uso_ultraportatil
	?estado <- (uso_port 2)
	=>
	(retract ?estado)
	(assert (mostrar_ultraportatil))
)

(defrule uso_ultraportatil_alto
	?estado <- (uso_port 3)
	=>
	(assert (mostrar_ultrportatil_H_P))
 	(retract ?estado)
)

(defrule uso_Juegos
	?estado <- (uso_port 4)
	=>
	(assert (mostrar_Juegos))
 	(retract ?estado)
)

(defrule uso_estacion_trabajo
	?estado <- (uso_port 5)
	=>
	 (retract ?estado)
	(assert (mostrar_WE))
)

(defrule uso_incorrecto
	(declare (salience -5))
	?estado <- (uso_port ?eleccion)
	=>
	(printout t "Opcion de uso incorrecta" crlf)
	(retract ?estado)
	(assert (busqueda_por_uso))
)
;---------------------------------------------------------MULTIMEDIA-----------------------------------------------------------
(defrule muestra_multimedia
	?estado <- (mostrar_multimedia) ?result <-( portatil {Blueray == "si" && HDMI == "si" && Pantalla > 15.0 && Tamaño_disco_duro > 300})
	=>
    (printout t "------------------------------------------------------" crlf
				"Caracteristicas del:" crlf
				"Modelo			: 	"  	?result.Modelo 					crlf 
				"Color			:	"	?result.Color					crlf
	)
)

(defrule pregunta_portatil_multi
	(declare (salience -5))
	?estado <- (mostrar_multimedia)
	=> 
	(retract ?estado)
	(printout t "	Introduzca el modelo de portatil que le interesa" crlf)
	(assert (query (read)))
)
;----------------------------------------------------------ULTRAPORTATIL-------------------------------------------------------
(defrule muestra_ultraportatil
	?estado <- (mostrar_ultraportatil) ?result <-( portatil {Pantalla < 14.0 && Autonomia > 4 && Peso < 1.5})
	=>
    (printout t "------------------------------------------------------" crlf
				"Caracteristicas del:" crlf
				"Modelo			: 	"  	?result.Modelo 					crlf 
				"Color			:	"	?result.Color					crlf
	)
)

(defrule pregunta_portatil_ultra
	(declare (salience -5))
	?estado <- (mostrar_ultraportatil)
	=> 
	(retract ?estado)
	(printout t "	Introduzca el modelo de portatil que le interesa" crlf)
	(assert (query (read)))
)
;----------------------------------------------------------ULTRAPORTATIL ALTO RENDIMIENTO--------------------------------------
(defrule muestra_ultraportatil_alto
	?estado <- (mostrar_ultrportatil_H_P) ?result <-( portatil {Pantalla < 14.0 && Autonomia > 4 && (Procesador > 2.0 || Multicore > 2) && RAM > 2&&
				Peso < 1.5})
	=>
    (printout t "------------------------------------------------------" crlf
				"Caracteristicas del:" crlf
				"Modelo			: 	"  	?result.Modelo 					crlf 
				"Color			:	"	?result.Color					crlf
	)
)

(defrule pregunta_portatil_ultra
	(declare (salience -5))
	?estado <- (mostrar_ultrportatil_H_P)
	=> 
	(retract ?estado)
	(printout t "	Introduzca el modelo de portatil que le interesa" crlf)
	(assert (query (read)))
)
;----------------------------------------------------------PORTATIL JUEGOS-----------------------------------------------------
(defrule muestra_juegos
	?estado <- (mostrar_Juegos) ?result <-( portatil {Pantalla > 15 && Procesador >= 2.0 || Multicore >= 4 && RAM >= 4 && 
				(Grafica == "Profesional" || Grafica == "Alta")})
	=>
    (printout t "------------------------------------------------------" crlf
				"Caracteristicas del:" crlf
				"Modelo			: 	"  	?result.Modelo 					crlf 
				"Color			:	"	?result.Color					crlf
	)
)

(defrule pregunta_juegos
	(declare (salience -5))
	?estado <- (mostrar_Juegos)
	=> 
	(retract ?estado)
	(printout t "	Introduzca el modelo de portatil que le interesa" crlf)
	(assert (query (read)))
)
;----------------------------------------------------------ESTACION DE TRABAJO-------------------------------------------------
(defrule muestra_ultraportatil_alto
	?estado <- (mostrar_WE) ?result <-( portatil {Procesador >= 2.0 || Multicore >= 4 && RAM >= 4 && 
				Grafica == "Profesional" && Autonomia > 6})
	=>
    (printout t "------------------------------------------------------" crlf
				"Caracteristicas del:" crlf
				"Modelo			: 	"  	?result.Modelo 					crlf 
				"Color			:	"	?result.Color					crlf
	)
)

(defrule pregunta_portatil_ultra
	(declare (salience -5))
	?estado <- (mostrar_WE)
	=> 
	(retract ?estado)
	(printout t "	Introduzca el modelo de portatil que le interesa" crlf)
	(assert (query (read)))
)

;----------------------------------------------------------
;--------------------------------------------------------------------------------------------------------------
;------------------------------------BUSQUEDA POR PRECIO-------------------------------------------------------
;--------------------------------------------------------------------------------------------------------------

(defrule menu_precio
  ?eleccion <- (menu busqueda 2)
=>
 (retract ?eleccion)
 (assert (busqueda_por_precio))
)
;--------------------------------------------------------MENU PRECIO----------------------------------------------

(defrule busqueda_por_precio
	(busqueda_por_precio)
=>
	(printout t "A elegido busqueda por precio" crlf
				"Escriba el numero que precede al rango de precios que desea consultar. "crlf)
	(printout t "1- Menos de 300 euros (para seleccionar introduce 0+INTRO+300+INTRO)" crlf)
	(printout t "2- Entre 300 y 600 euros (para seleccionar introduce 300+INTRO+600+INTRO)" crlf)
	(printout t "3- Entre 600 y 900 euros (para seleccionar introduce 600+INTRO+900+INTRO)" crlf)
	(printout t "4- Entre 900 y 1200 euros (para seleccionar introduce 900+INTRO+1200+INTRO)" crlf)
    (printout t "5- Entre 1200 y 1500 euros (para seleccionar introduce 1200+INTRO+1500+INTRO)" crlf)
    (printout t "6- Mas de 1500 euros (para seleccionar introduce 1500+INTRO+0+INTRO)" crlf)
	(assert (rango_precio (read) (read)))
)

(defrule eleccionRango
?eleccion <- (rango_precio ?minimo ?maximo)
 =>
  (bind ?re (run-query* obtener-lista-portatiles ))
  (while (?re next)
  (bind ?p (?re getObject port))
  (if (or (< ?p.Precio ?minimo) (> ?p.Precio ?maximo)) then
        (printout t ?p.Modelo crlf)
  	(retract ?p)))
  	(retract ?eleccion)
)

;--------------------Query que devuelve el nombre y el precio de todos los portatiles---------------------------

(defquery query_portatiles_rango
  "Devuelve informacion de los portatiles de un rango en concreto"
  (portatil (Modelo ?mod)( Precio ?pre))
)

(defrule lista_portatiles_del_rango
	?eleccion <-(consultar_rango ?minimo ?maximo)
=>
    (printout t "------------------------------------------------------" crlf
        		"  Lista de Portatiles dentro del rango especificado" crlf
        		"------------------------------------------------------" crlf)
	(bind ?result (run-query* query_portatiles_rango))
	(while (?result next)
        (if (= ?minimo 1500) then
        	(if ( >= (?result getInt pre) ?minimo ) then
             	(printout t "Modelo: "(?result getString mod) "  Precio: " (?result getInt pre) crlf 
				)
            )
        elif (and ( >= (?result getInt pre) ?minimo ) ( <= (?result getInt pre) ?maximo )) then
    		(printout t "Modelo: "(?result getString mod) "   Precio: " (?result getInt pre) crlf 
			)
        )
    )
    (retract ?eleccion)
	(assert (eleccion-portatil_del_rango ?result))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                             Nuevas Reglas                                     ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



(defrule eleccion_final_rango
    ?lista <- (eleccion-portatil_del_rango ?result)
=>
    (printout t "Escribe el modelo como se describe aqui y entre comillas. "crlf)
    ( assert (query (read) ))
)

(defrule seleccionPantalla
    ?result <- (pantalla-por-tamaño ?minimo ?maximo)
=>
    (bind ?result (run-query* obtener-lista-portatiles))
    (while (?result next)
        (bind ?portatil (?result getObject port))
        (if (or (< ?portatil.Pantalla ?minimo) (> ?portatil.Pantalla ?maximo)) then
            (retract ?portatil)))
         (retract ?result)
)

(defrule seleccionRAM
    ?result <- (memoria-RAM ?minimo ?maximo)
=>
    (bind ?result (run-query* obtener-lista-portatiles))
    (while (?result next)
        (bind ?portatil (?result getObject port))
        (if (or (< ?portatil.RAM ?minimo) (> ?portatil.RAM ?maximo)) then
            (retract ?portatil)))
        (retract ?result)
)

(defrule seleccionHDiscoDuro
    ?result <- (disco-duro ?minimo ?maximo)
=>
    (bind ?result (run-query* obtener-lista-portatiles))
    (while (?result next)
        (bind ?portatil (?result getObject port))
        (if (or (< ?portatil.Tamaño_disco_duro ?minimo) (> ?portatil.Tamaño_disco_duro ?maximo)) then
            (retract ?portatil)))
        (retract ?result)
)

(defrule seleccionVelocidadProcesador
    ?result <- (velocidad-procesador ?minimo ?maximo)
=>
    (bind ?result (run-query* obtener-lista-portatiles))
    (while (?result next)
        (bind ?portatil (?result getObject port))
        (if (or (< ?portatil.Procesador ?minimo) (> ?portatil.Procesador ?maximo)) then
            (retract ?portatil)))
        (retract ?result)
)

(defrule seleccionSO
    ?result <- (sistema-operativo ?nombre)
=>
    (bind ?result (run-query* obtener-lista-portatiles))
    (while (?result next)
        (bind ?portatil (?result getObject port))
        (if (<> ?portatil.SO ?nombre) then
            (retract ?portatil)))
        (retract ?result)
)

(defrule seleccionAutonomia
    ?result <- (autonomia ?tiempoMin ?tiempoMax)
=>
    (bind ?result (run-query* obtener-lista-portatiles))
    (while (?result next)
        (bind ?portatil (?result getObject port))
        (if (or (< ?portatil.Autonomia ?tiempoMin) (> ?portatil.Autonomia ?tiempoMax)) then
            (retract ?portatil)))
        (retract ?result)
)

(defrule seleccionGarantia
    ?result <- (duracion-garantia ?tiempo)
=>
    (bind ?result (run-query* obtener-lista-portatiles))
    (while (?result next)
        (bind ?portatil (?result getObject port))
        (if (< ?portatil.Garantia ?tiempo) then
            (retract ?portatil)))
            (retract ?result)
)

(defquery obtener-lista-portatiles
"Devuelve todos los PC's que hay en la BC"
?port<-(portatil)
)


(deffunction mostrar_todo  ()

  (bind ?re (run-query* obtener-lista-portatiles ))
  (bind ?contador 0)
  (while (?re next)
  (bind ?p (?re getObject port))
  (printout t "--------------------------------------------------------------------------" crlf)
  (mostrar ?p)
  (printout t "--------------------------------------------------------------------------" crlf)
  (bind ?contador (+ ?contador  1) ))
  (printout t ?contador " Portatiles cumplen los requisitos introducidos " crlf crlf crlf)
  (printout t "Para mas informacion visitar http://www.lenovo.com/es/es/" crlf) )


(reset)
(run)